﻿//链接：https://ac.nowcoder.com/acm/contest/8563/A
//来源：牛客网
//给一个数组，一共有
//n 个数。
//你能进行最多
//
//k 次操作。每次操作可以进行以下步骤：
//选择数组中的一个偶数​
//，将其变成​
/// 2 。
//现在你进行不超过
//�
//
//k 次操作后，让数组中所有数之和尽可能小。请输出这个最小的和。
//
//
//
//输入描述:
//第一行输入两个正整数
//n 和
//k ，用空格隔开
//第二行输
//n 个正整数
//输出描述:
//一个正整数，代表和的最小值。
//示例1
//输入
//复制
//5 3
//2 4 8 10 11
//输出
//复制
//24
//说明
//对8操作2次，对10操作1次，最后的数组是2 4 2 5 11。可以证明这样的操作是最优的。
//



//思路：利用大堆+筛选求和：这里我们首先要把这组数据分为偶数和奇数，然后如果是奇数，就加给ret
//否则就是偶数就可以除2，那么我们要想它最后ret最小肯定是选最大的除2，然后需要一个容器来放偶数：
//满足：可以一下子就取到最大值，而且可以插入，可以排序得到最大，故这里可以考虑大堆：优先队列
//因此每次取一个top，然后把它除二，如果还是偶数继续放入重建大堆，奇数就不能操作了，因此加入ret
//依次重复操作，那么最后要么是次数为0，要么大堆空了，若为0，则大堆中一次pop加入ret，否则直接返回ret；


#include<iostream>
#include<vector>
#include<queue>
#define ll long long
using namespace std;
int main() {
    int n, k;
    priority_queue<int, vector<int>> p;
    long long ret = 0;//这里假设数组元素都是接近10^9那么10^5个元素就超了整型范围。
    cin >> n >> k;
    vector<int>v(n);
    for (int i = 0; i < n; i++) cin >> v[i];
    for (int i = 0; i < n; i++) {
        if (v[i] & 1) ret += v[i];
        else {
            p.push(v[i]);
        }
    }
    while (!p.empty() && k--) {
        int top = p.top();
        p.pop();
        top /= 2;
        if (top & 1) ret += top;
        else p.push(top);


    }
    while (!p.empty()) {
        ret += p.top();
        p.pop();
    }
    cout << ret << endl;
}
